#include <iostream>
#include <vector>
#include "Thread.hpp"
#include "lockguard.hpp"

using namespace ThreadMoudle;

int tickets = 10000;
void route(ThreadData *td)
{
    std::cout << "route:" << td->_name << std::endl;
    sleep(1);
    while (true)
    {
        Lock lock(td->_mutex);
        if (tickets > 0)
        {
            usleep(1000);
            std::cout << td->_name << ":" << tickets << std::endl;
            tickets--;
        }
        else
        {
            break;
        }
    }
}
int main()
{
    pthread_mutex_t mutex;
    pthread_mutex_init(&mutex, nullptr);
    std::vector<Thread> threads;
    for (int i = 0; i < 4; i++)
    {
        std::string name = "thread-" + std::to_string(i + 1);
        ThreadData *td = new ThreadData(name, &mutex);
        threads.emplace_back(name, route, td);
    }

    for (auto &thread : threads)
    {
        thread.start();
    }

    for (auto &thread : threads)
    {
        thread.join();
    }

    pthread_mutex_destroy(&mutex);

    return 0;
}

// int tickets = 1000;
// void route(const std::string &name)
// {
//     while (true)
//     {
//         pthread_mutex_lock(&mutex);
//         if (tickets > 0)
//         {
//             usleep(1000);
//             std::cout << name << ":" << tickets << std::endl;
//             tickets--;
//             pthread_mutex_unlock(&mutex);
//         }
//         else
//         {
//             pthread_mutex_unlock(&mutex);
//             break;
//         }
//     }
// }
// void Print(const std::string &name)
// {
//     while (true)
//     {
//         std::cout << name << " running" << std::endl;
//         sleep(1);
//     }
// }

// int main()
// {
//     pthread_mutex_init(&mutex, nullptr);//创造锁

//     Thread t1("thread-1", route);
//     Thread t2("thread-2", route);
//     Thread t3("thread-3", route);
//     Thread t4("thread-4", route);

//     t1.start();
//     t2.start();
//     t3.start();
//     t4.start();

//     t1.join();
//     t2.join();
//     t3.join();
//     t4.join();

//     pthread_mutex_destroy(&mutex);//销毁锁

//     // std::vector<Thread> threads;

//     // // 创建
//     // for (int i = 0; i < 4; i++)
//     // {
//     //     std::string name = "thread-" + std::to_string(i + 1);
//     //     threads.emplace_back(name, Tickets);
//     // }

//     // for (auto &thread : threads)
//     // {
//     //     thread.start();
//     // }
//     // for (auto &thread : threads)
//     // {
//     //     thread.stop();
//     // }
//     // for (auto &thread : threads)
//     // {
//     //     thread.join();
//     // }

//     return 0;
// }
// int main()
// {
//     std::string name = "thread-1";
//     Thread *th = new Thread(name, Print);

//     th->start();
//     sleep(10);
//     th->stop();
//     th->join();
//     return 0;
// }
